好的,最後我們重新檢視我們的訊息交換中心。
require 'em-websocket'
require 'mongo'
require 'json'
include Mongo
#
# connecting to the database (for history)
#
client = MongoClient.new # defaults to localhost:27017
db = client['Boo']
@coll = db['dialog']
#
# boo_log history method
#
def boo_log(logStr)
_currentTime = Time.new.to_s
_logAry = logStr.split(',')
_sortAry = [_logAry[0].to_s,_logAry[1].to_s].sort
_did = _sortAry[0].to_s + _sortAry[1].to_s
if @coll.find("did" => _did).to_a.empty?
# if not found , then insert
_jsonObj_insert = {:did => _did,:dialog => [{:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}]}
@coll.insert(_jsonObj_insert)
else
# if found , then update
@coll.update({:did => _did}, {:$push => {:dialog => {:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}}},:upsert => true)
end
end
#
# chat server
#
puts "Server is listening!..."
@uid = []
@sid = []
@channel_list = []
EM.run {
@channel = EM::Channel.new
EM::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen { |handshake|
puts "WebSocket connection open"
# first message to subscribe channel
@sid << @channel.subscribe {|msg|
puts "received:" + msg + "---"
ws.send msg # send itself
puts "history record"
}
tid = @sid.last
puts "#{@sid.last} connect!"
ws.onmessage {|msg|
@uid = msg.split(/,/)
@channel.push "#{msg}"
boo_log(msg.to_s)
}
ws.onclose {
@channel.unsubscribe(tid)
puts "#{tid} conection closed!"
}
} # onopen end
end
}
我們可以看到 在訊息溝通的時候,會先將前述的訊息格式進行解析parse的動作。並且進行發送,在client端會去接收訊息。然後呼叫boo_log() 方法來寫入資料庫。
以下是boo_log() 方法:
def boo_log(logStr)
_currentTime = Time.new.to_s
_logAry = logStr.split(',')
_sortAry = [_logAry[0].to_s,_logAry[1].to_s].sort
_did = _sortAry[0].to_s + _sortAry[1].to_s
if @coll.find("did" => _did).to_a.empty?
# if not found , then insert
_jsonObj_insert = {:did => _did,:dialog => [{:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}]}
@coll.insert(_jsonObj_insert)
else
# if found , then update
@coll.update({:did => _did}, {:$push => {:dialog => {:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}}},:upsert => true)
end
end
接著我們可以在server端,直接使用mongo指令進入資料庫。
Mongo
並且使用資料庫Boo 來查看我們的資料表(Collections)
Use boo
可以看我們在歷史訊息之中資料庫的寫入狀況。
Db.dialog.find()
至於格式如下:
我們可以看到發送端 以及傳送端。 如果已經建立歷史訊息,則在原則上我們會以Update資料表。
@coll.update({:did => _did}, {:$push => {:dialog => {:from => _logAry[0] , :to => _logAry[1] , :datetime => _currentTime , :log => _logAry[2]}}},:upsert => true)
反之,如果沒有歷史訊息,也就是說第一次寫入,我們會將新的資料表insert進入。
@coll.insert(_jsonObj_insert)
可以看到歷史訊息的格式,每次歷史訊息會以陣列的方式進入。所以在程式碼上我們會做個判斷。
當然在歷史訊息的設計上,我們可以使用session storage來減少server端的存取次數。
這點可以利用HTML5的storage來幫助我們進行這功能的改善。